package com.example.innerclass2;

/**
 * 演示静态内部类的使用
 */
public class StaticInnerClass01 {
    public static void main(String[] args) {
        outer10 outer = new outer10();
        /*
        1.静态内部类是定义在外部类的成员位置，并且有static修饰
        2.可以直接访问外部类的所有静态成员，包含私有的，但不能直接访问非静态成员
        3.可以添加任意访问修饰符(public、protected、默认、private)，因为它的地位就是一个成员。
        4.作用域：同其他的成员，为整个类体
        5.静态内部类---访问---->外部类(比如：静态属性)[访问方式：直接访问所有静 态成员]
        6.外部类---访问------>静态内部类 访问方式：创建对象，再访问
        7.外部其他类---访问----->静态内部类
        8.如果外部类和静态内部类的成员重名时，静态内部类访问的时，默认遵循就近 原则，如果想访问外部类的成员，则可以使用（外部类名.成员）去访问
         */

        //7.外部其他类---访问----->静态内部类
        //方式1
        //因为静态内部类，是可以通过类名直接访问(前提是满足访问权限)
        outer10.Inner10 inner10 = new outer10.Inner10();
        inner10.hi();
        //方式2
        //编写一个方法，可以返回静态内部类的对象实例.
        outer10.Inner10 inner101 = outer.getInner10();
        inner101.hi();

    }
}

class outer10 {
    //私有属性
    private int n1 = 10;
    //私有的静态属性
    private static String name = "jack";

    //私有的静态方法
    private static void cry() {
    }

    //1.静态内部类是定义在外部类的成员位置，并且有static修饰
    //Inner10就是静态内部类
    //定义在类的局部位置上
    //并且是static修饰的
    //3.可以添加任意访问修饰符(public、protected、默认、private)，因为它的地位就是一个成员。
    //4.作用域：同其他的成员，为整个类体
    static public class Inner10 {
        private static String name = "tom";

        //2.可以直接访问外部类的所有静态成员，包含私有的，但不能直接访问非静态成员
        public void hi() {
            //直接使用外部类的静态私有属性
            System.out.println(name);
            //直接使用外部类的静态私有方法
            cry();
            //不能直接使用外部类的非静态属性,会报错
            //System.out.println(n1);


            //5.静态内部类---访问---->外部类(比如：静态属性)[访问方式：直接访问所有静 态成员]
            //访问外部类的静态私有属性
            System.out.println(name);
            //访问外部类的静态私有方法
            cry();

            //8.如果外部类和静态内部类的成员重名时，静态内部类访问的时，默认遵循就近 原则，如果想访问外部类的成员，则可以使用（外部类名.成员）去访问
            System.out.println(name);//因为遵守的是就近原则，所以访问的是内部类中的name
            System.out.println(outer10.name);//访问的就是外部类中的name属性
            System.out.println(Inner10.name);//访问的就是内部类中的name属性
        }
    }

    //编写方法返回Inner10对象
    public Inner10 getInner10() {
        return new Inner10();
    }

    public void m1() {
        //6.外部类---访问------>静态内部类 访问方式：创建对象，再访问
        Inner10 inner10 = new Inner10();
        System.out.println(inner10.name);
        inner10.hi();
    }
}
